﻿using BLevy.Datos.Interfases;
using BLevy.Entidad;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using DapperExtensions;

namespace BLevy.Datos.Repositories
{
    public interface ILocalidadRepository : IRepository<Localidad>
    {
        IList<Localidad> FindAllConCiudadProvincia();
        IList<Localidad> FindAllPorCiudad(int ciudad_id);
        IList<Localidad> FindAllPorCiudadActivos(int ciudad_id);
        IList<Localidad> FindAllActivos();
    }

    public class LocalidadRepository : ILocalidadRepository
    {
        protected readonly IDbConnection _db;

        public LocalidadRepository()
        {
            try
            {
                _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString());
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IList<Localidad> FindAll()
        {
            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Localidad>("SELECT * FROM LOCALIDADES").ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IQueryable<Localidad> Find(System.Linq.Expressions.Expression<Func<Localidad, bool>> predicate)
        {
            throw new NotImplementedException();
        }

        public Localidad FindById(int id)
        {
            string query = "SELECT * FROM LOCALIDADES " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Localidad>(query, new { id = id }).SingleOrDefault();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Add(Localidad newEntity)
        {
            string query = "INSERT INTO LOCALIDADES (PROVINCIA_ID, CIUDAD_ID, LOCALIDAD, ACTIVO) " +
                            "VALUES (@provincia_id, @ciudad_id, @localidad, @activo)";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        provincia_id = newEntity.provincia_id,
                        ciudad_id = newEntity.ciudad_id,
                        localidad = newEntity.localidad,
                        activo = newEntity.activo
                    });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Remove(int id)
        {
            string query = "UPDATE LOCALIDADES SET ACTIVO = 0 " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new { id = id });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Modify(Localidad entity)
        {
            string query = "UPDATE LOCALIDADES SET PROVINCIA_ID = @provincia_id, " +
                "CIUDAD_ID = @ciudad_id, LOCALIDAD = @localidad, ACTIVO = @activo " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        provincia_id = entity.provincia_id,
                        ciudad_id = entity.ciudad_id,
                        localidad = entity.localidad,
                        activo = entity.activo,
                        id = entity.id
                    });
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public IList<Localidad> FindAllConCiudadProvincia()
        {
            string query = "SELECT * FROM LOCALIDADES " +
                "INNER JOIN PROVINCIAS ON PROVINCIAS.ID = LOCALIDADES.PROVINCIA_ID " +
                "INNER JOIN CIUDADES ON CIUDADES.ID = LOCALIDADES.CIUDAD_ID " +
                "ORDER BY LOCALIDADES.ID ASC";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Localidad, Provincia, Ciudad, Localidad>(query,
                        (localidad, provincia, ciudad) =>
                        {
                            localidad.provincia = provincia;
                            localidad.ciudad = ciudad;
                            return localidad;
                        },
                            splitOn: "id").ToList();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IList<Localidad> FindAllPorCiudad(int ciudad_id)
        {
            string query = "SELECT * FROM LOCALIDADES " +
                "WHERE CIUDAD_ID = " + ciudad_id;

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Localidad>(query).ToList();
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public IList<Localidad> FindAllActivos()
        {
            throw new NotImplementedException();
        }


        public IList<Localidad> FindAllPorCiudadActivos(int ciudad_id)
        {
            //string query = "SELECT * FROM LOCALIDADES " +
            //   "WHERE CIUDAD_ID = " + ciudad_id + " AND ACTIVO = 1";

            string query = "SELECT * FROM LOCALIDADES " +
               "WHERE CIUDAD_ID = " + ciudad_id + " AND ACTIVO = 1";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Localidad>(query).ToList();
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }
    }
}
